<?php

/*
 * Независимый от шаблонизатора класс представления
 * 
 */

namespace T4;

class View {
    
    const DEFAULT_ADAPTER = 'Twig';

    /**
     * Пути, по которым нужно искать шаблоны
     * @var array массив путей 
     */
    protected $paths = array();

    /**
     *
     * @var array Данные, переданные в представление 
     */
    protected $data = array();

    /**
     * Конструктор
     * @param array $paths Массив с дополнительными путями для поиска шаблонов
     */
    public function __construct($paths=array()) {
	
	$this->paths = (array)$paths;
	
	/**
	 * Создаем объект-адаптер к шаблонному движку
	 */
	$adapterName = self::DEFAULT_ADAPTER;
	$adapterClassName = __NAMESPACE__ . '\\VIEW\\' . ucfirst($adapterName) . 'Adapter';
	$this->adapter = new $adapterClassName;

	/*
	 * А еще нужно заполнить системные переменные
	 */
	$this->assign('T4', CMS::collectSystemData());
	
    }

    public function assign($first, $second=null) {

	if (null == $second && is_array($first)) {

	    foreach ($first as $key => $value) {
		$this->data[$key] = $value;
	    }
	} else {
	    $this->data[$first] = $second;
	}
    }
    
    /**
     * Получение накопленного в объекте массива данных
     * @return array Массив данных 
     */
    public function getData() {
	return $this->data;
    }
    
    public function getPaths() {
	return array_unique($this->paths);
    }

    final protected function findTemplate($template) {
        
        if (file_exists($template) )
            return $template;

	foreach ($this->getPaths() as $path) {
 	    $fullpath = $path . '/' . $template;
	    if (file_exists($fullpath))
		return $fullpath;
	}

        throw new Exception('Шаблон ' . $template . ' не найден по заданным путям');
        
    }

    /**
     * Рендеринг шаблона с данными
     * @param string $template Имя шаблона
     * @return string Результат обработки данных шаблоном
     */
    public function render($template) {

	try {

	    $template = $this->findTemplate($template);
	    $html = $this->adapter->render($this, $template);
	    $html = Template::process($html);
	    return $html;
	    
	} catch (Exception $e) {

	    throw new Exception($e->getMessage());
	}
    }

}